package main

import (
	"fmt"
	"time"
	"context"
)

func main() {
	// 基于context.Background()为根，创建新的超时上下文
	fmt.Printf("Begin:%s\n",time.Now())
	// WithTimeout 函数接收父上下文(parent)和一个超时时间，
	// 能够从 context.Context 中衍生出一个新的子上下文并返回用于取消该上下文的函数。
	// 执行取消函数时功能和WithCancel一样。
	timeoutCtx, cancelFunc := context.WithTimeout(context.Background(), 3*time.Second)
	// 3秒后 执行WithTimeout返回的取消上下文的函数
	defer cancelFunc()
	// 执行子协程，将WithTimeout返回的子 context传入
	go func(ctx context.Context) {
		fmt.Printf("子协程执行: %s \n",time.Now())
	}(timeoutCtx)
	// 等待上下文处于完成状态
	<-timeoutCtx.Done()
	fmt.Printf("等待超时结束：%s \n",time.Now())
}
